import numpy as np
from PIL import Image
import matplotlib.pyplot as plt #画图的
from scipy.ndimage import gaussian_filter #引入高斯核
#下面这个方法是用来处理单个通道的
def ssr_channel_raw(channel, sigma=80):
    """最原始形式的SSR处理，不加epsilon""" #这句话的意思是没有常数
    # 转为 float32 并归一化到 0~1
    channel = channel.astype(np.float32) / 255.0
    # 计算光照估计（高斯模糊）
    illumination = gaussian_filter(channel, sigma=sigma)
    # SSR：直接做 log 差
    with np.errstate(divide='ignore', invalid='ignore'):#这个代码用于临时关闭numpy相关的报错，因为接下来的操作可能会出现一些奇怪的值，但是都将其替换了
        retinex = np.log(channel) - np.log(illumination)
        # 处理无穷值：将-inf 置为最小值（避免画面一片黑）
        retinex[np.isneginf(retinex)] = np.min(retinex[np.isfinite(retinex)])
    # 归一化到0~1
    retinex -= np.min(retinex)
    retinex /= np.max(retinex)
    # 恢复到uint8
    return (retinex * 255).astype(np.uint8)
#这个方法接收一长image图像然后用上面的方法对其三个通道进行处理
def ssr_image_raw(img_pil, sigma=80):
    img = np.array(img_pil)
    if img.ndim == 2:
        return Image.fromarray(ssr_channel_raw(img, sigma))
    elif img.ndim == 3:
        channels = [ssr_channel_raw(img[..., c], sigma) for c in range(3)]
        retinex = np.stack(channels, axis=-1)
        return Image.fromarray(retinex)
    else:
        raise ValueError("Unsupported image format")

# 示例：使用你的图片
if __name__ == "__main__":
    img = Image.open("D:\Retinex\\test\\test.jpg").convert("RGB")
    result = ssr_image_raw(img, sigma=80)

    # 可视化结果
    plt.subplot(1, 2, 1)
    plt.imshow(img)
    plt.title("Original")

    plt.subplot(1, 2, 2)
    plt.imshow(result)
    plt.title("SSR (No epsilon)")
    plt.show()
